package com.pai4j.zwiki.service.queue;

import com.pai4j.common.util.JsonUtil;
import com.pai4j.zwiki.dto.ZWikiTaskMessage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.stereotype.Service;

/**
 * ZWiki任务消息生产者
 * 负责发送任务到消息队列
 *
 * @author pai4j
 * @since 2025-10-14
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class ZWikiTaskProducer {

    private final RocketMQTemplate rocketMQTemplate;

    /**
     * 任务队列主题
     */
    private static final String TASK_QUEUE_TOPIC = "zwiki_task_queue";

    /**
     * 通知队列主题
     */
    private static final String NOTIFICATION_TOPIC = "zwiki_notification_queue";

    /**
     * 发送任务到队列
     *
     * @param taskMessage 任务消息
     */
    public void sendTask(ZWikiTaskMessage taskMessage) {
        try {
            String message = JsonUtil.toJsonString(taskMessage);
            
            // 根据优先级设置延迟级别（RocketMQ支持）
            if (taskMessage.getPriority() != null && taskMessage.getPriority() >= 5) {
                // 高优先级任务立即发送
                rocketMQTemplate.syncSend(TASK_QUEUE_TOPIC, message);
            } else {
                // 普通优先级任务
                rocketMQTemplate.convertAndSend(TASK_QUEUE_TOPIC, message);
            }

            log.info("发送任务到队列成功: taskId={}, taskType={}, priority={}", 
                    taskMessage.getTaskId(), taskMessage.getTaskType(), taskMessage.getPriority());

        } catch (Exception e) {
            log.error("发送任务到队列失败: taskId={}, error={}", 
                    taskMessage.getTaskId(), e.getMessage(), e);
            throw new RuntimeException("发送任务到队列失败", e);
        }
    }

    /**
     * 发送通知消息
     *
     * @param message 通知消息（JSON）
     */
    public void sendNotification(String message) {
        try {
            rocketMQTemplate.convertAndSend(NOTIFICATION_TOPIC, message);
            log.debug("发送通知消息成功: {}", message);
        } catch (Exception e) {
            log.error("发送通知消息失败: message={}, error={}", message, e.getMessage(), e);
            // 通知发送失败不影响主流程
        }
    }
}

